package main

import (
	"errors"
	"fmt"
)

/*
#简单可读，尽早返回
*/
func main() {
	fmt.Println("努力减少嵌套块的数量，对齐左侧的正常代码路径，已经尽早返回，这些是提高代码可读性的具体方法")
}

// 由于复杂的嵌套导致无法直观阅读所有的 case 的执行流程。
func errorDemo(s1, s2 string, max int) (string, error) {
	if s1 == "" {
		return "", errors.New("s1 is empty")
	} else {
		if s2 == "" {
			return "", errors.New("s2 is empty")
		} else {
			concat, err := concatenate(s1, s2)
			if err != nil {
				return "", err
			} else {
				if len(concat) > max {
					return concat[:max], nil
				} else {
					return concat, nil
				}
			}
		}
	}
}

// 减少 if 之后没有必要的 else 嵌套，使得所有 case 可以一眼明了。
func rightDemo(s1, s2 string, max int) (string, error) {
	if s1 == "" {
		return "", errors.New("s1 is empty")
	}
	if s2 == "" {
		return "", errors.New("s2 is empty")
	}
	concat, err := concatenate(s1, s2)
	if err != nil {
		return "", err
	}
	if len(concat) > max {
		return concat[:max], nil
	}
	return concat, nil
}

func concatenate(s1, s2 string) (string, error) {
	// ...
	return s1 + s2, nil
}
